import 'dart:convert';
import 'package:mybase/base/tool/empty/FFEmpty.dart';
import 'package:mybase/base/tool/file/FFile.dart';
import 'dart:core';
import 'dart:io';

class MyLanguageTestRun {


  static Future<void> createLanguageCode({
    required String templateFile, //模板目录
    required String targetFile, //目标文件
  }) async {

    bool isTemplateFileExist = await FFile.isExistFile(templateFile);
    if (isTemplateFileExist == false) {
      print("模板文件不存在 ${templateFile}");
      return;
    }

    bool isTargetFileExist = await FFile.isExistFile(targetFile);
    if (isTargetFileExist == false) {

      File? createTargetFile = await FFile.createFile(targetFile);
      if (createTargetFile == null) {
        print("创建目标文件失败 ${targetFile}");
        return;
      }
    }

    String templateCode = await FFile.readAsString(templateFile);
    if (FFEmpty.stringIsEmpty(templateCode)) {
      print("模板文件内容不应该为空 ${templateFile}");
      return;
    }

    //取模板文件转化成Map
    Map<String,dynamic>? templateMap;
    try {
      templateMap = json.decode(templateCode);
    } catch (e) {
      print("模板文件内容必须是Map,且不能为空 ${templateFile}");
      return;
    }
    if (FFEmpty.mapIsEmpty(templateMap)) {
      print("模板文件内容必须是Map,且不能为空 ${templateFile}");
      return;
    }

    //取目标文件转化成Map
    String targetCode = await FFile.readAsString(targetFile);

    Map<String,dynamic>? targetMap;
    if (FFEmpty.stringIsEmpty(targetCode)) {
      targetMap = {};
    }  else {
      try {
        targetMap = json.decode(targetCode);
      } catch (e) {
        print("目标文件内容必须是Map ${templateFile}");
        return;
      }
    }

    valueIsMap(templateMap!, targetMap!);

    String content = json.encode(targetMap);
    bool success = await FFile.writeContentByPath(filePath: targetFile, content: content,mode: FileMode.write);
    if (success == true) {
      print("目标文件追加方法成功 ${targetFile}");
    }  else {
      print("目标文件追加方法失败，请去目标文件Commnd + Z, ${targetFile}");
    }
  }

  static Map<String,dynamic> valueIsMap(Map<String,dynamic> templateMap,Map<String,dynamic> targetMap) {
    templateMap.forEach((key, value) {
      //如果值是map
      if (value != null && value is Map) {
        Map<String,dynamic> childTemplateMap = value as Map<String,dynamic>;
        Map<String,dynamic>? childTargetMap;
        if (!targetMap.containsKey(key)) {
          childTargetMap = {};
        } else {
          childTargetMap = targetMap[key];
        }
        childTargetMap = valueIsMap(childTemplateMap, childTargetMap!);
        targetMap[key] = childTargetMap;
      } else {
        if (!targetMap.containsKey(key)) {
          targetMap[key] = value;
        }
      }

    });

    return targetMap;
  }


  static Future<String> createLanguageCodeStr({
    required String templateFile, //模板目录
    required String targetFile, //目标文件
  }) async {

    bool isTemplateFileExist = await FFile.isExistFile(templateFile);
    if (isTemplateFileExist == false) {
      return "模板文件不存在 ${templateFile}";
    }

    bool isTargetFileExist = await FFile.isExistFile(targetFile);
    if (isTargetFileExist == false) {

      File? createTargetFile = await FFile.createFile(targetFile);
      if (createTargetFile == null) {
        return "创建目标文件失败 ${targetFile}";
      }
    }

    String templateCode = await FFile.readAsString(templateFile);
    if (FFEmpty.stringIsEmpty(templateCode)) {
      return "模板文件内容不应该为空 ${templateFile}";
    }

    //取模板文件转化成Map
    Map<String,dynamic>? templateMap;
    try {
      templateMap = json.decode(templateCode);
    } catch (e) {
      return "模板文件内容必须是Map,且不能为空 ${templateFile}";
    }
    if (FFEmpty.mapIsEmpty(templateMap)) {
      return "模板文件内容必须是Map,且不能为空 ${templateFile}";
    }

    //取目标文件转化成Map
    String targetCode = await FFile.readAsString(targetFile);

    Map<String,dynamic>? targetMap;
    if (FFEmpty.stringIsEmpty(targetCode)) {
      targetMap = {};
    }  else {
      try {
        targetMap = json.decode(targetCode);
      } catch (e) {
        return "目标文件内容必须是Map ${templateFile}";
      }
    }

    valueIsMap(templateMap!, targetMap!);

    String content = json.encode(targetMap);

    //格式化输出json
    content = JsonEncoder.withIndent('  ').convert(targetMap);

    bool success = await FFile.writeContentByPath(filePath: targetFile, content: content,mode: FileMode.write);
    if (success == true) {
      return "目标文件追加方法成功 ${targetFile}";
    }  else {
      return "目标文件追加方法失败，请去目标文件Commnd + Z, ${targetFile}";
    }
  }

}
